// import _ from 'lodash'
import _ from 'lodash'

export default {
  name: 'dialog-mixin',
  props: {
    show: { // 弹窗的显示。
      type: Boolean,
      default: false
    },
    isEdit: { // 默认为添加页面
      type: Boolean,
      default: false
    },
    isCopy: {
      type: Boolean,
      default: false,
      required: false
    }
  },
  data () {
    return {
      mixinDialgOptions: {
        addURL: '', // 提交的URL
        editURL: '', // 提交的URL
        getListUrl: '', // 编辑时候获取详情的url
        getListKey: ['id'], // 获取明细根据默认为id;默认只传入一个参数
        isSetData: false, // 获取的数据是否进去处理 func => setData
        isChangeData: false, // 请求数据是否进去处理 func => changeData
        title: '', // 标题内容
        isForm: true // 是否是表单 如果是的默认 ref= myForm
      },
      dialogType: ['detail', 'add', 'edit'], // 弹窗类型
      isVisible: false, // 弹窗的显示
      isShowInnerLoading: false, // 弹窗loading
      dataForm: {}, // 提交表单数据
      tableData: [] // 如果含有表格数据
    }
  },
  computed: {
    // 弹窗标题
    dialogTitle () {
      const msg = this.isCopy ? '复制' : this.isEdit ? '编辑' : '添加'
      return `${msg}${this.mixinDialgOptions.title}`
    }
  },
  methods: {
    // 初始化弹窗
    initDialog (params, isGetList = true) {
      this.isVisible = true
      this.dataForm = Object.assign({}, this.$options.data.call(this).dataForm)
      isGetList ? this.getListById(params[this.mixinDialgOptions.getListKey]) : (this.mixinDialgOptions.isSetData
        ? this.setData(params)
        : this.dataForm = Object.assign({}, this.dataForm, params))
    },
    // 提交数据
    submit () {
      const params = this.mixinDialgOptions.isChangeData ? this.changeData() : this.dataForm
      this.isShowInnerLoading = true
      !this.isEdit
        ? this.mixinDialgOptions.addURL(params).then(res => {
          this.isShowInnerLoading = false
          res.code === '1200' && this.$message.success('创建成功')
          this.reset()
        }).catch(err => {
          console.log(err)
          this.isShowInnerLoading = false
        })
        : this.mixinDialgOptions.editURL(params).then(res => {
          this.isShowInnerLoading = false
          res.code === '1200' && this.$message.success('编辑成功')
          this.reset()
        }).catch(err => {
          console.log(err)
          this.isShowInnerLoading = false
        })
    },
    // 取消关闭的情况
    reset (isRest = true) {
      Object.assign(this.dataForm, this.$options.data.call(this).dataForm)
      this.mixinDialgOptions.isForm && this.$refs.myForm.resetValidation()
      this.isVisible = false
      this.$emit('onRefresh', isRest)
    },
    // edit => detail
    getListById (data) {
      this.isShowInnerLoading = true
      this.mixinDialgOptions.getListUrl(data).then(res => {
        this.isShowInnerLoading = false
        const ret = res.data
        this.mixinDialgOptions.isSetData
          ? this.setData(ret)
          : this.dataForm = Object.assign({}, this.dataForm, ret)
      }).catch(err => {
        console.log(err)
        this.isShowInnerLoading = false
      })
    },
    /**
     * 枚举类型如果禁用状态需要显示为空
     * @param dataForm 目标值
     * @param enumOptions enumOptions: { emum: options }
     * @param ret 返回值
     */
    setNewEnumByEmpty (dataForm, enumOptions, ret) {
      _.forEach(enumOptions, (options, v) => {
        this.$set(dataForm, v, _.isEmpty(_.filter(options, { value: ret[v] })) ? '' : ret[v])
      })
    }
  }
}
